package com.mobile_fault_detector.controller;

import com.mobile_fault_detector.entity.RepairTicket;
import com.mobile_fault_detector.service.IRepairTicketService;
import com.mobile_fault_detector.utils.Result;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;

/**
 * 工单控制器
 */
@Slf4j
@RestController
@RequestMapping("/ticket")
@RequiredArgsConstructor
public class RepairTicketController {

    private final IRepairTicketService repairTicketService;

    /**
     * 创建工单
     * @param repairTicket 工单信息
     * @return 创建成功的工单信息
     */
    @PostMapping("/create")
    public Result createTicket(@RequestBody RepairTicket repairTicket) {
        try {
            // 参数验证
            if (repairTicket == null) {
                return Result.fail("工单信息不能为空");
            }
            if (repairTicket.getProblemDescription() == null || repairTicket.getProblemDescription().trim().isEmpty()) {
                log.info("创建工单失败: {}", repairTicket);
                return Result.fail("问题描述不能为空");
            }

            // 设置初始状态为待处理
            repairTicket.setTicketStatus(0);

            log.info("创建工单: {}", repairTicket);
            return Result.ok(repairTicketService.createTicket(repairTicket));
        } catch (Exception e) {
            log.error("创建工单失败，工单信息: {}, 异常信息: {}", repairTicket, e.getMessage(), e);
            String error = String.format("创建工单失败，时间：%s", LocalDateTime.now());
            return Result.fail(error);
        }
    }

    /**
     * 根据工单ID查询工单信息
     * @param ticketId 工单ID
     * @return 工单信息
     */
    @GetMapping("/getTicket/{ticketId}")
    public Result getTicketById(@PathVariable Long ticketId) {
        try {
            // 参数验证
            if (ticketId == null || ticketId <= 0) {
                return Result.fail("工单ID不能为空且必须大于0");
            }

            log.info("查询工单信息，工单ID: {}", ticketId);
            return Result.ok(repairTicketService.getTicketById(ticketId));
        } catch (Exception e) {
            log.error("查询工单信息失败，工单ID: {}, 异常信息: {}", ticketId, e.getMessage(), e);
            String error = String.format("查询工单信息失败，工单ID：%d，时间：%s", ticketId, LocalDateTime.now());
            return Result.fail(error);
        }
    }

    /**
     * 根据用户ID查询工单列表
     * @param userId 用户ID
     * @return 工单列表
     */
    @GetMapping("/user/{userId}")
    public Result getTicketsByUserId(@PathVariable Long userId) {
        try {
            // 参数验证
            if (userId == null || userId <= 0) {
                return Result.fail("用户ID不能为空且必须大于0");
            }

            log.info("查询用户工单列表，用户ID: {}", userId);
            return Result.ok(repairTicketService.getTicketsByUserId(userId));
        } catch (Exception e) {
            log.error("查询用户工单列表失败，用户ID: {}, 异常信息: {}", userId, e.getMessage(), e);
            String error = String.format("查询用户工单列表失败，用户ID：%d，时间：%s", userId, LocalDateTime.now());
            return Result.fail(error);
        }
    }

    /**
     * 更新工单状态
     * @param ticketId 工单ID
     * @param status 工单状态
     * @return 更新后的工单信息
     */
    @PutMapping("/status/{ticketId}/{status}")
    public Result updateTicketStatus(@PathVariable Long ticketId, @PathVariable Integer status) {
        try {
            // 参数验证
            if (ticketId == null || ticketId <= 0) {
                return Result.fail("工单ID不能为空且必须大于0");
            }
            if (status == null || status < 0 || status > 3) {
                return Result.fail("工单状态不正确，有效值为0-3");
            }

            // 先查询工单是否存在
            RepairTicket existTicket = repairTicketService.getTicketById(ticketId);
            if (existTicket == null) {
                return Result.fail("工单不存在");
            }

            log.info("更新工单状态，工单ID: {}, 状态: {}", ticketId, status);
            return Result.ok(repairTicketService.updateTicketStatus(ticketId, status));
        } catch (Exception e) {
            log.error("更新工单状态失败，工单ID: {}, 状态: {}, 异常信息: {}", ticketId, status, e.getMessage(), e);
            String error = String.format("更新工单状态失败，工单ID：%d，时间：%s", ticketId, LocalDateTime.now());
            return Result.fail(error);
        }
    }
}